<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    
</body>
<script>
    // function Fn(n){
    //     this.name = n;
    // }

    // Fn.prototype.show = function(){
    //     console.log(this.name);
    // }

    // var f1 = new Fn("张三");
    
    // console.log(f1);

    // console.log(f1.age);
    // console.log(f1.show);

    // f1.show();

    // console.log(f1.__proto__)
    // 对象的属性：__proto__

    // 对象的隐式原型：__proto__，自身是一个指针，指向了一个对象，指向的这个对象可以作为当前对象的父级对象

    // 对象查找属性的原则：先在自身查找，找到了，就使用；没找到，沿着__proto__向上级查找，直到顶层，如果没有找到，才抛出undefined，任意一层找到了，都使用，然后停止查找。
    // 就近原则

    // 原型链：对象通过__proto__与上级产生的联系

    // 函数的prototype，显示原型，是一个对象类型，对函数自身没有作用，专门用来给：自身所属的函数被new执行时，创建出来的实例，做父级对象使用（被__proto__指向）

    // prototype内有一个内置属性constructor，没有实际作用，用来表示当前prototype属于哪个函数

    // 任何数据，只要有原型，顶层必然是Object.prototype
    // Object.prototype是所有原型链的顶层对象
    // 在js中万物皆对象


    function Fn(){
        this.show = "hahaha";
    }

    Fn.prototype.show = "hello";

    var f = new Fn();

    console.log(f);

    console.log(f.__proto__ === Fn.prototype);       // t

    console.log(f.__proto__.show);

    console.log(f.show);




</script>
</html>